package br.ufrj.dcc.so.entidades.militares;

import java.util.concurrent.Semaphore;

import br.ufrj.dcc.so.entidades.clientes.Cliente;
import br.ufrj.dcc.so.entidades.clientes.EnumPatente;
import br.ufrj.dcc.so.forte.Forte;
import br.ufrj.dcc.so.forte.barbearia.Barbearia;
import br.ufrj.dcc.so.forte.barbearia.Funcionario;

public class SargentoTainha extends Funcionario{
	
	private Forte forte;
	private Barbearia barbearia;
	private Semaphore semaforoClientes;
	private Semaphore semaforoLugares;
	private int numPausa = 0;
	private boolean fimDia = false;
	
	public SargentoTainha(Forte forte, Barbearia barbearia, Semaphore semaforoLugares, Semaphore semaforoClientes) {
		this.barbearia = barbearia;
		this.forte = forte;		
		
		this.semaforoLugares = semaforoLugares;
		this.semaforoClientes = semaforoClientes;
	}

	@Override
	public void run() {
		while(!fimDia)
		{
			adicionaClienteBarbearia();
			aguardaProximaChegada();
		}
		
	}

	/**
	 * Método que faz o tenente ficar esperando apróxima chegada de algum cliente.
	 */
	private void aguardaProximaChegada() {
		sleep((forte.geraEvento()%5+1));
	}

	/**
	 * Método que verifica se há um cliente querendo entrar na barbearia.
	 * Se houver cliente querendo entrar e tiver espaço na barbearia, ele adiciona.
	 */
	private void adicionaClienteBarbearia() {
			Cliente cliente = forte.getCliente();			
			tentaAdicionarCliente(cliente);	
			verificaFechamento();
	}

	private void tentaAdicionarCliente(Cliente cliente) {
		try {
			if(!EnumPatente.PAUSA.equals(cliente.getPatente())){
				
				//Verifico se há espaço para a produção de mais um produto.
				semaforoLugares.acquire();
				barbearia.addClienteEspera(cliente);
				//Indico que há pelo menos um produto já produzido.
				semaforoClientes.release();
				
				numPausa = 0;
			}else {
				numPausa++;
				System.out.println("Nenhum cliente chegou.\t:"+numPausa);
			}
		
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	private void verificaFechamento() {
		if(numPausa>=3){
			barbearia.fecha();
			fimDia = true;
		}
	}

}
